package tecnicas;

import java.util.ArrayList;

import matriz.Matriz;
import datosFamilias.*;

public class RelacionPorCriterio {
    private int criterio;
    
    public RelacionPorCriterio(int numCriterio)
    {
        criterio = numCriterio;
    }
    
    public Matriz obtenerRelacionPorCriterio(ArrayList<Familia> familias)
    {
        Matriz matriz = new Matriz(familias.size(), familias.size());
        int min = familias.get(0).calcularPuntajes(criterio);
        int max = familias.get(0).calcularPuntajes(criterio);
        for(int index = 1; index < familias.size(); index++)
        {
            int pjeFamilia = (familias.get(index)).calcularPuntajes(criterio);
            if(pjeFamilia < min)
            {
                min = pjeFamilia;
            }
            else
            {
                if(pjeFamilia > max)
                {
                    max = pjeFamilia;
                }
            }
        }
        ArrayList<Integer> intervalos = obtenerIntervalos(min, max);
        return obtenerRelaciones(familias, intervalos);
    }
      
    private ArrayList<Integer> obtenerIntervalos(Integer min, Integer max)
    {
        ArrayList<Integer> intervalos = new ArrayList<Integer>();
        Integer dif = max - min;
        Float intervalo = dif/9f;
        
        for (float i = 1f; i <= 9f; i++)
        {
            Float aux = intervalo * i;
            if (aux-aux.intValue() >= 0.5f)
                intervalos.add(aux.intValue()+1);
            else
                intervalos.add(aux.intValue());
        }
        return intervalos;
    }
    
    private Matriz obtenerRelaciones(ArrayList<Familia> familias, ArrayList<Integer> intervalos)
    {
        Matriz matriz = new Matriz(familias.size(), familias.size());
        for(int i = 0; i < familias.size(); i++)
        {
            int puntajeFamFila = (familias.get(i)).calcularPuntajes(criterio);
            for (int j = i; j < familias.size(); j++)
            {
                if (i == j)
                {
                    matriz.agregarValor(i, j, 1f);
                }
                else
                {
                    int puntajeFamColumna = (familias.get(j)).calcularPuntajes(criterio);
                    if (puntajeFamFila >= puntajeFamColumna)
                        matriz.agregarValor(i, j, obtenerRelacion(puntajeFamFila, puntajeFamColumna, intervalos));
                    else
                        matriz.agregarValor(j, i, obtenerRelacion(puntajeFamColumna, puntajeFamFila, intervalos));
                }
            }
        }
        return matriz;
    }
    
    private float obtenerRelacion(int fam1, int fam2, ArrayList<Integer> intervalos)
    {
        int dif = fam1 - fam2;
        int i = 0;
        while (intervalos.get(i) < dif)
            i++;
        return (float)(i+1f);
    }
}
